Base Concept
Adapter:负责提供视图来展示数据
Position:在Adapter中数据项的位置
Index:附加子视图的索引,用于调用
getChildAt(int)
Binding:准备子视图来展示adapter中对于位置的数据的过程
Recycle view:一个先前被用来展示adapter中特定位置的数据的view,被放入了cache中,以便后面再次展示同一类型的数据。这样可以通过避免初始化布局的填充和构造而显著的改善性能。
Scrap view:在布局期间暂时进入分离状态的子视图。Scrap view可能被重用,没有被从RecyclerView中完全分离,也有可能没有要求重新binding而不会发生改变,也有可能被认为是dirty而被adapter修改。
Dirty view:在展示之前必须被adapter重新binding的子视图。
Positions in RecyclerView
RecyclerView在RecyclerView.Adapter和RecyclerView.LayoutManager间引入了新的抽象,来在布局计算期间能够检测到数据集批量的改变。这使得LayoutManager从追踪adapter数据改变来计算动画中脱离出来。这也使得性能得到改善,因为所有的view binding在同时发生,避免不必要的binding。
由于这个原因,在RecyclerView中有两种position相关的方法:
- layout position:item在最新布局计算中的位置。是从LayoutManager视角的位置
- adapter position:item在adapter中的位置。是从Adapter视角的位置
返回或接收layout position的方法,使用position作为最新布局计算的位置。这些positions包含了所有的变化直到最新的布局计算。这些positions和用户在屏幕上看到是一致的。
另一种类型的position的相关方法是以*AdapterPosition的形式。你应该使用这些方法当你需要在最新的adapter position上做工作,尽管它们还没被显示到布局上。必须注意,这些方法在notifyDataSetChange被调用,新的布局还没计算出来的话将无法计算出adapter position,因为这个原因必须仔细处理从这些方法中返回的NO_POSITION或null结果。
当写LayoutManager时,基本上使用layout position;而在写RecyclerView时基本上使用adapter position